/*
 * Copyright (c) 2025 Industrial Software Feature Database
 */
package com.comac.ins.isfd.util;

import lombok.extern.slf4j.Slf4j;

import java.util.regex.Pattern;

@Slf4j
public class CardUtils {
    // 定义正则表达式
    private static final Pattern INTEGER_PATTERN = Pattern.compile("^-?\\d{1,8}$"); // 整数，最多8位
    private static final Pattern FLOAT_OR_SCIENTIFIC_PATTERN = Pattern.compile("^-?\\d{1,8}\\.\\d{1,8}$|^-?\\d{1,8}(\\.\\d{1,8})?[eE][+-]?\\d{1,8}$");
    private static final Integer MAXIMUM_CARD_LENGTH = 8;

    // 验证 整数格子字段
    public static String validateIntegerPlace(String place) {
        if (place == null || place.length() > MAXIMUM_CARD_LENGTH) {
            return null;
        }
        if (INTEGER_PATTERN.matcher(place).matches()) {
            return place;
        }
        return null;
    }

    // 验证 浮点数格子字段并进行格式纠正
    public static String validateAndCorrectFloatPlace(String place) {
        if (place == null || place.length() > MAXIMUM_CARD_LENGTH) {
            return null; // 无效输入返回 null
        }
        // 如果是有效的浮点数或科学计数法格式，直接返回
        if (FLOAT_OR_SCIENTIFIC_PATTERN.matcher(place).matches()) {
            return place;
        }
        // 检查是否是整数格式
        if (INTEGER_PATTERN.matcher(place).matches()) {
            try {
                long intValue = Long.parseLong(place);
                // 转为浮点数格式
                String floatFormat = String.format("%.1f", (double) intValue);
                if (floatFormat.length() <= MAXIMUM_CARD_LENGTH) {
                    log.warn("修改占位内容，原始内容：{}， 修改后：{}", place, floatFormat);
                    return floatFormat; // 如果浮点数长度符合，返回该格式
                }
                // 转为科学计数法
                String scientificFormat = String.format("%.1e", (double) intValue);
                if (scientificFormat.length() <= MAXIMUM_CARD_LENGTH) {
                    log.warn("修改占位内容，原始内容：{}， 修改后：{}", place, scientificFormat);
                    return scientificFormat; // 如果科学计数法长度符合，返回该格式
                }
            } catch (NumberFormatException e) {
                // 异常处理，整数解析失败
                return null;
            }
        }
        return null; // 既不是有效的浮点数，也不是可纠正的整数
    }

    /**
     * 根据单行内容获取cardName
     */
    public static String getCardName(String line) {
        return line.substring(0, Math.min(8, line.length())) // 截取前8个字符，防止越界
            .split(",", 2)[0]   // 按逗号分割，取第一部分
            .split("\t", 2)[0]  // 按制表符分割，取第一部分
            .strip()            // 去除两端空白
            .toUpperCase();     // 转为大写
    }
}
